package com.qf.listener;

import com.qf.config.RabbitMQConfig;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Component
public class MQListener {

//    @RabbitListener(queues = "bus-queue")
//    public void busQueue(String msg, Channel channel, Message message) {
//        System.out.println("业务队列监听的内容是：" + msg);
//        long deliveryTag = message.getMessageProperties().getDeliveryTag();
//        if ("error".equals(msg)) {
//            // 这个消息消费不了
//            //basicNack(消息的标识，是否批量删除，是否重新加入队列)
//            // nack的消息没有压入队列，此时如果该队列配置了死信就会转到死信队列中，否则消息就会丢失
//            try {
//                channel.basicNack(deliveryTag, false, false);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        } else {
//            // 非error的消息可以正常消费
//            try {
//                channel.basicAck(deliveryTag, false);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//    }

    @RabbitListener(queues = "dlx-queue")
    public void dlxQueue(String msg, Channel channel, Message message) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("【" + simpleDateFormat.format(new Date()) + "】这是死信队列的内容(到这个队列中的消说明其他队列都消费不了)：" + msg);
//        try {
//            /channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
    }

    ExecutorService executorService = Executors.newFixedThreadPool(10);

    // 消费者中是使用单线程的方式进行消费的
    @RabbitListener(queues = "max-queue")
    public void maxQueueListener(String msg, Channel channel, Message message) {
        executorService.submit(() -> {
            System.out.println("最大队列消息消息:" + msg);
            try {
                // 模拟消费1个消息需要1s
                Thread.sleep(1000);
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        });

    }
}
